Tenemos un base de datos de una encuesta sobre percepciones de estudiantes de enseñanza básica sobre la calidad de la educación que reciben. La encuesta fue aplicada a niños y niñas que cursan 3°, 4° y 5° básico e incluye preguntas sobre la satisfacción con el colegio, los profesores, las metodologías de enseñanza-aprendizaje y otras materias.
getwd()
## [1] "C:/Users/Camila O. Inostroza/Documents/Estadística Correlacional/Trabajo final"
setwd("C:/Users/Camila O. Inostroza/Documents/Estadística Correlacional/Trabajo final")
load("C:/Users/Camila O. Inostroza/Documents/Estadística Correlacional/Trabajo final/Base.RData")
En función de esta información, plantearemos tres hipótesis para ser contrastadas con los datos.
H1=La edad de los estudiantes estaría asociada con la recomendación que los niños y niñas hacen de su colegio. (Variable continua:EDAD, Variable 2 categorías: COL_2)
H2=La edad de los estudiantes estaría relacionada con la percepción que tienen los niños y niñas sobre la estima de sus profesores. (Variable continua:EDAD, Variable 3 categorías: COL_5)
H3=La dependencia administrativa del colegio estaría asociada con la percepción que tienen los niños y niñas sobre la estima de sus profesores. (Variable categórica 1: ESTABLECIMIENTO, Variable categórica 2:COL_5)
Antes que todo, instalamos los paquetes que utilizaremos en el análisis:
library(dplyr) #manipulación de datos
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(stargazer) #tablas
##
## Please cite as:
## Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
## R package version 5.2.2. https://CRAN.R-project.org/package=stargazer
library(kableExtra) #tablas
library(ggplot2) #gráficos
library(Rmisc) #agrupar estadísticos
## Loading required package: lattice
## Loading required package: plyr
## -------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## -------------------------------------------------------------------------
##
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
library(psych)#D de Cohen
##
## Attaching package: 'psych'
## The following object is masked from 'package:car':
##
## logit
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(lsr)#D de Cohen
library(scales)
##
## Attaching package: 'scales'
## The following objects are masked from 'package:psych':
##
## alpha, rescale
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
library(sjstats)
##
## Attaching package: 'sjstats'
## The following objects are masked from 'package:psych':
##
## pca, phi
library(userfriendlyscience)
##
## Attaching package: 'userfriendlyscience'
## The following object is masked from 'package:lsr':
##
## cramersV
## The following object is masked from 'package:lattice':
##
## oneway
Comenzaremos analizando la primera hipótesis. H1=La edad de los estudiantes estaría asociada con la recomendación que los niños y niñas hacen de su colegio. Para esto asignaremos etiquetas a la variable COL_2, eliminaremos los casos perdidos y pediremos descriptivos a través de una tabla.
names(Datos) #muestra los nombres de las variables
## [1] "EDAD" "SEXO" "ESTABLECIMIENTO" "COL_1"
## [5] "COL_2" "COL_5" "PED22_3" "HOG23"
table(Datos$COL_2) #Veo que hay un caso perdido (-999), pero no es reconocido como NA por el software
##
## -999 1 2
## 1 49 90
Datos$COL_2<-recode(Datos$COL_2, '-999=NA')#Le indico al programa que(-999) corresponde a un missing
Datos <- Datos[!is.na(Datos$COL_2),]#Elimino la fila que contiene el missing de la base de datos
table(Datos$COL_2)#Ahora el missing no aparece en la variable
##
## 1 2
## 49 90
Datos$COL_2 <- factor(Datos$COL_2, levels = c(1,2), labels = c("No", "Sí"))#Asigno etiquetas a variable COL_2
tabla1 = Datos %>% #creamos objeto "tabla1"
dplyr::count(COL_2) %>%
dplyr::mutate(Proporcion = prop.table(n))
tabla1$Proporcion=round(tabla1$Proporcion,3) #redonder números a 3 decimales
tabla1
## # A tibble: 2 x 3
## COL_2 n Proporcion
## <fct> <int> <dbl>
## 1 No 49 0.353
## 2 Sí 90 0.647
kable(tabla1,caption="Descriptivos: Le diría a mis amigos(as) que se cambiaran a este establecimiento (COL_2)",col.names=c("Categorías","Obs.","Proporción"))#Genera tabla de descriptivos para variable COL_2
| Categorías | Obs. | Proporción |
|---|---|---|
| No | 49 | 0.353 |
| Sí | 90 | 0.647 |
Pedimos descriptivos para la variable cuantitativa “Edad”
mean(Datos$EDAD)# Revisamos la media de Edad
## [1] 9.769784
sd(Datos$EDAD)# Revisamos la desviación estándar
## [1] 0.9877257
#Generamos un histograma para describir la distribución de la variable "EDAD"
ggplot(Datos, aes(x=EDAD)) + geom_histogram(bins=7) + labs(x="Edad", y="Frecuencia observada") +
geom_vline(aes(xintercept = mean(EDAD)),col='red',size=0.5,linetype = "dashed") + scale_x_continuous(labels = scales::comma) + annotate("text", x = 14, y = 80, label = c("Media=9.769 s=0.988"),size = 3)
#Podemos revisar también las edad de los estudiantes según su respuesta en COL_2
tabla2=Datos %>%
dplyr::group_by(COL_2) %>%
dplyr::summarise(Obs.=n(),Promedio=mean(EDAD),Desviacion=sd(EDAD))
tabla2
## # A tibble: 2 x 4
## COL_2 Obs. Promedio Desviacion
## <fct> <int> <dbl> <dbl>
## 1 No 49 9.55 0.937
## 2 Sí 90 9.89 0.999
kable(tabla2,caption="Descriptivos de Edad según categorías de respuesta COL_2",col.names=c("Categorías","Obs.","Promedio","Desviación Estándar"))
| Categorías | Obs. | Promedio | Desviación Estándar |
|---|---|---|---|
| No | 49 | 9.551020 | 0.9367769 |
| Sí | 90 | 9.888889 | 0.9993756 |
A simple vista los resultados descriptivos parecen indicar que no hay diferencias de edad entre quienes sí recomendarían su colegio y quienes no lo harían. Sin embargo, para confirmar esta conclusión debemos revisar los intervalos de confianza de la variable EDAD y realizar las pruebas de hipótesis correspondientes. Primero, calcularemos los intervalos de confianza:
#Intervalo de confianza al 95% para el total de la muestra, con N=139; Media= 9.769; Desv. Estándar= 0.988
#Error estándar
0.988/sqrt(138)
## [1] 0.08410415
#0.0841
#Margen de error
0.0841 *1.96
## [1] 0.164836
#0.164836
#Límite inferior y superior del intervalo de confianza
9.769 - 0.164836 #9.604164
## [1] 9.604164
9.769 + 0.164836 #9.933836
## [1] 9.933836
#Intervalos de confianza al 95% para ambos grupos
#No recomendaría el colegio:
#N = 49; media = 9.551020; Desviación Estándar =0.9367769
#Error estándar
0.9367769/sqrt(48)
## [1] 0.1352121
#0.1352121
#Margen de error
0.1352121*1.96
## [1] 0.2650157
#0.2650157
#Límite inferior y superior del intervalo de confianza
9.551020-0.2650157 #9.286004
## [1] 9.286004
9.551020+0.2650157 #9.816036
## [1] 9.816036
#Sí recomendaría el colegio:
#N = 90; media = 9.888889; Desviación Estándar =0.9993756
#Error estándar
0.9993756/sqrt(89)
## [1] 0.1059336
#0.1059336
#Margen de error
0.1059336*1.96
## [1] 0.2076299
#0.2076299
#Límite inferior y superior del intervalo de confianza
9.888889-0.2076299 #9.681259
## [1] 9.681259
9.888889+0.2076299 #10.09652
## [1] 10.09652
#De acuerdo con estos resultados, no existirían diferencias poblaciones en la edad de los estudiantes que recomiendan y los que no recomiendan su colegio, ya que los intervalos de confianza se superponen entre sí
graf_2 <- summarySE(Datos, measurevar="EDAD", groupvars=c("COL_2")) #creamos variables para graficar
names(graf_2)
## [1] "COL_2" "N" "EDAD" "sd" "se" "ci"
ggplot(graf_2, aes(x=COL_2, y=EDAD)) +
geom_errorbar(aes(ymin=EDAD-ci, ymax=EDAD+ci), width=.1) +
geom_line() +
geom_point() +
labs(x="Recomendaría o no su colegio", y="Edad")
## geom_path: Each group consists of only one observation. Do you need to
## adjust the group aesthetic?
Ahora realizaremos una prueba t student al 95% de confianza para evaluar si se rechaza o no la hipótesis nula de ausencia de diferencias entre los grupos. Sin embargo, previamente tenemos que verificar que exista homogeneidad de varianzas entre los grupos a comparar. Hacemos esto a través del test de Levene.
leveneTest(EDAD ~ COL_2, center=mean, data = Datos) #No rechazo H0, por lo que aplicaremos una prueba t
## Levene's Test for Homogeneity of Variance (center = mean)
## Df F value Pr(>F)
## group 1 0.2934 0.589
## 137
t.test(EDAD ~ COL_2, data=Datos, conf.level=0.95, var.equal = TRUE)
##
## Two Sample t-test
##
## data: EDAD by COL_2
## t = -1.9461, df = 137, p-value = 0.05369
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.681176262 0.005439301
## sample estimates:
## mean in group No mean in group Sí
## 9.551020 9.888889
La prueba t muestra un valor-p en el límite de la significación (p-value = 0.05369). Sin embargo, para ser estrictos con el criterio, no rechazaremos la hipótesis nula ya que el valor es levemente superior a (0.05). Así entonces, concluimos que no existen diferencias significativas en las edades de quienes recomiendan y no recomiendan su colegio. Finalmente, aunque no hemos encontrado una relación significativa entre ambas variables, calcularemos igualmente D de Cohen.
cohensD(Datos$EDAD ~ Datos$COL_2)
## [1] 0.3455044
#0.3455044
Encontramos un efecto pequeño-moderado, aunque no es estadísticamente significativo considerando un 95% de confianza.
H2=La edad de los estudiantes estaría asociada con la percepción que tienen los niños y niñas sobre la estima de sus profesores (Variable continua:EDAD, Variable 3 categorías: COL_5). Primero asignaremos etiquetas a la variable COL_5 y pediremos descriptivos a través de una tabla y gráficos.
table(Datos$COL_5)
##
## 1 2 3
## 16 38 85
Datos$COL_5 <- factor(Datos$COL_5, levels = c(1,2,3), labels = c("No me siento querido(a)", "Me siento querido(a)", "Me siento muy querido(a)"))#Asigno etiquetas a variable COL_5
table(Datos$COL_5)
##
## No me siento querido(a) Me siento querido(a) Me siento muy querido(a)
## 16 38 85
tabla3 = Datos %>% #creamos objeto "tabla3"
dplyr::count(COL_5) %>%
dplyr::mutate(Proporcion = prop.table(n))
tabla3$Proporcion=round(tabla3$Proporcion,3) #redonder números a 3 decimales
tabla3
## # A tibble: 3 x 3
## COL_5 n Proporcion
## <fct> <int> <dbl>
## 1 No me siento querido(a) 16 0.115
## 2 Me siento querido(a) 38 0.273
## 3 Me siento muy querido(a) 85 0.612
kable(tabla3,caption="Descriptivos: Me siento querido por mis profesores (COL_5)",col.names=c("Categorías","Obs.","Proporción"))#Genera tabla de descriptivos para variable COL_5
| Categorías | Obs. | Proporción |
|---|---|---|
| No me siento querido(a) | 16 | 0.115 |
| Me siento querido(a) | 38 | 0.273 |
| Me siento muy querido(a) | 85 | 0.612 |
g_COL_5=ggplot(Datos, aes(x=COL_5)) + geom_bar(aes(y = (..count..)/sum(..count..)),fill="pink") + scale_y_continuous(labels=percent, limits = c(0,0.7)) + labs(x="Me siento querido por mis profesores", y="Porcentaje")
g_COL_5 #Obtengo gráfico de barras de la variable COL_5
#También revisamos las edades de los estudiantes según su respuesta en COL_5
tabla4=Datos %>%
dplyr::group_by(COL_5) %>%
dplyr::summarise(Obs.=n(),Promedio=mean(EDAD),Desviacion=sd(EDAD))
tabla4
## # A tibble: 3 x 4
## COL_5 Obs. Promedio Desviacion
## <fct> <int> <dbl> <dbl>
## 1 No me siento querido(a) 16 9.88 0.806
## 2 Me siento querido(a) 38 9.95 0.837
## 3 Me siento muy querido(a) 85 9.67 1.07
kable(tabla4,caption="Descriptivos de Edad según categorías de respuesta COL_5",col.names=c("Categorías","Obs.","Promedio","Desviación Estándar"))
| Categorías | Obs. | Promedio | Desviación Estándar |
|---|---|---|---|
| No me siento querido(a) | 16 | 9.875000 | 0.8062258 |
| Me siento querido(a) | 38 | 9.947368 | 0.8365750 |
| Me siento muy querido(a) | 85 | 9.670588 | 1.0733596 |
De acuerdo con los datos descriptivos, los estudiantes que responden “Me siento querido(a) por mis profesores” tienen una media de edad mayor que los dos grupos restantes.
Para testear la Hipótesis 2 revisaremos primero los intervalos de confianza para cada grupo:
#Intervalos de confianza al 95% para los tres grupos
#No me siento querido(a):
#N = 16; media = 9.875000 ; Desviación Estándar =0.8062258
#Error estándar
0.8062258/sqrt(15)
## [1] 0.2081666
#0.2081666
#Margen de error
0.2081666*1.96
## [1] 0.4080065
#0.4080065
#Límite inferior y superior del intervalo de confianza
9.875000-0.4080065 #9.466993
## [1] 9.466993
9.875000+0.4080065 #10.28301
## [1] 10.28301
#"Me siento querido(a)":
#N = 38; media = 9.947368; Desviación Estándar =0.8365750
#Error estándar
0.8365750/sqrt(37)
## [1] 0.1375321
#0.1375321
#Margen de error
0.1375321*1.96
## [1] 0.2695629
#0.2695629
#Límite inferior y superior del intervalo de confianza
9.875000-0.2695629 #9.605437
## [1] 9.605437
9.875000+0.2695629 #10.14456
## [1] 10.14456
#"Me siento muy querido(a)":
#N= 85; media= 9.670588; Desviación Estándar= 1.0733596
#Error estándar
1.0733596/sqrt(84)
## [1] 0.1171131
#0.1171131
#Margen de error
0.1171131*1.96
## [1] 0.2295417
#0.2295417
#Límite inferior y superior del intervalo de confianza
9.670588-0.2295417 #9.441046
## [1] 9.441046
9.670588+0.2295417 #9.90013
## [1] 9.90013
#De acuerdo con estos resultados, no existirían diferencias poblaciones en la edad de los estudiantes por categoría de respuesta en la variable COL_5, ya que los intervalos de confianza se superponen entre sí.
#Graficamos los Intervalos de Confianza
graf_3 <- summarySE(Datos, measurevar="EDAD", groupvars=c("COL_5")) #creamos variables para graficar
names(graf_3)
## [1] "COL_5" "N" "EDAD" "sd" "se" "ci"
ggplot(graf_3, aes(x=COL_5, y=EDAD)) +
geom_errorbar(aes(ymin=EDAD-ci, ymax=EDAD+ci), width=.1) +
geom_line() +
geom_point() +
labs(x="Me siento querido(a) por mis profesores", y="Edad")
## geom_path: Each group consists of only one observation. Do you need to
## adjust the group aesthetic?
A continuación, pedimos una prueba ANOVA, pero previamente debemos testear si se cumple el supuesto de homogeneidad de varianzas entre grupos.
modelo1=lm(EDAD ~ COL_5, data = Datos)
leveneTest(modelo1, center=mean)# Se rechaza H0, por lo que realizaremos el test de Welch para evaluar nuestra hipótesis
## Levene's Test for Homogeneity of Variance (center = mean)
## Df F value Pr(>F)
## group 2 5.5866 0.004659 **
## 136
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
oneway.test(EDAD ~ COL_5, data=Datos, na.action=na.omit, var.equal=FALSE)
##
## One-way analysis of means (not assuming equal variances)
##
## data: EDAD and COL_5
## F = 1.2571, num df = 2.000, denom df = 43.497, p-value = 0.2946
Considerando un 95% de confianza y dado que hemos obtenido un valor 0.2834, no podemos rechazar H0, por lo que concluimos que no existe relación entre la edad y la percepción de estima que tienen los estudiantes respecto de sus profesores.
No obstante estos resultados, podemos calcular el tamaño de efecto entre ambas variables, además de realizar pruebas PostHoc para saber qué grupo es más distinto del resto.
oneway(Datos$EDAD, Datos$COL_5,corrections = TRUE,posthoc = 'games-howell')
## ### Oneway Anova for y=EDAD and x=COL_5 (groups: No me siento querido(a), Me siento querido(a), Me siento muy querido(a))
##
## Omega squared: 95% CI = [NA; .07], point estimate = 0
## Eta Squared: 95% CI = [0; .06], point estimate = .02
##
## SS Df MS F p
## Between groups (error + effect) 2.21 2 1.11 1.14 .324
## Within groups (error only) 132.42 136 0.97
##
##
## ### Post hoc test: games-howell
##
## diff ci.lo ci.hi t
## Me siento querido(a)-No me siento querido(a) 0.07 -0.53 0.67 0.30
## Me siento muy querido(a)-No me siento querido(a) -0.20 -0.78 0.37 0.88
## Me siento muy querido(a)-Me siento querido(a) -0.28 -0.70 0.15 1.55
## df p
## Me siento querido(a)-No me siento querido(a) 29.25 .952
## Me siento muy querido(a)-No me siento querido(a) 26.16 .659
## Me siento muy querido(a)-Me siento querido(a) 90.02 .274
##
## ### Welch correction for nonhomogeneous variances:
##
## F[2, 43.5] = 1.26, p = .295.
##
## ### Brown-Forsythe correction for nonhomogeneous variances:
##
## F[2, 74.61] = 1.44, p = .242.
#Ninguna de las comparaciones realizadas entre grupos muestra resultados estadísticamente significativos al 95% de confianza, tal como indica el test de Welch realizado.
anova1=Anova(modelo1, type = 3) #estimo anova para pedir Eta (paquete car)
eta_sq(anova1) #------------- el efecto es muy pequeño
## term etasq
## 1 (Intercept) 0.921
## 2 COL_5 0.001
H3=La dependencia administrativa del colegio estaría relacionada con la percepción que tienen los niños y niñas sobre la estima de sus profesores (Variable categórica 1: ESTABLECIMIENTO, Variable categórica 2:COL_5).
En primer lugar, asignaremos etiquetas a las variables y revisaremos sus estadísticos descriptivos
#Descriptivos Tipo de Establecimiento
Datos$ESTABLECIMIENTO <- factor(Datos$ESTABLECIMIENTO, levels = c(1,2), labels = c("Municipal","Particular subvencionado" ))#Asigno etiquetas a variable ESTABLECIMIENTO
tabla5 = Datos %>% #creamos objeto "tabla5"
dplyr::count(ESTABLECIMIENTO) %>% #n de casos
dplyr::mutate(Proporcion = prop.table(n)) #proporción
kable(tabla5,caption="Descriptivos Tipo de Establecimiento", col.names=c("Categorías","Obs.","Proporción"),digits = 3)
| Categorías | Obs. | Proporción |
|---|---|---|
| Municipal | 116 | 0.835 |
| Particular subvencionado | 23 | 0.165 |
#Descriptivos "Me siento querido por mis profesores"
kable(tabla3,caption="Descriptivos: Me siento querido por mis profesores (COL_5)",col.names=c("Categorías","Obs.","Proporción"))#Como ya estaba hecha esta tabla, sólo la volvemos a pedir.
| Categorías | Obs. | Proporción |
|---|---|---|
| No me siento querido(a) | 16 | 0.115 |
| Me siento querido(a) | 38 | 0.273 |
| Me siento muy querido(a) | 85 | 0.612 |
Ahora, generamos una tabla de doble entrada, entre las variables “Establecimiento” y “COL_5”
table(Datos$ESTABLECIMIENTO, Datos$COL_5,exclude = FALSE) #frecuencias observadas
##
## No me siento querido(a) Me siento querido(a)
## Municipal 15 34
## Particular subvencionado 1 4
##
## Me siento muy querido(a)
## Municipal 67
## Particular subvencionado 18
prop.table(table(Datos$ESTABLECIMIENTO, Datos$COL_5,exclude = FALSE),margin = 2) #proporciones columna,
##
## No me siento querido(a) Me siento querido(a)
## Municipal 0.9375000 0.8947368
## Particular subvencionado 0.0625000 0.1052632
##
## Me siento muy querido(a)
## Municipal 0.7882353
## Particular subvencionado 0.2117647
prop.table(table(Datos$ESTABLECIMIENTO, Datos$COL_5,exclude = FALSE),margin = 1) #proporciones fila,
##
## No me siento querido(a) Me siento querido(a)
## Municipal 0.12931034 0.29310345
## Particular subvencionado 0.04347826 0.17391304
##
## Me siento muy querido(a)
## Municipal 0.57758621
## Particular subvencionado 0.78260870
De acuerdo con estos resultados, en los establecimientos municipales existe una mayor proporción de estudiantes en la categoría “No me siento querido”. Para confirmar esta hipótesis aplicaremos una prueba de chi-cuadrado.
#Guardamos tabla bivariada como un objeto para luego realizar la prueba de chi-cuadrado
tabla6=table(Datos$ESTABLECIMIENTO, Datos$COL_5,exclude = FALSE)
chisq.test(tabla6) #chi cuadrado, no podemos rechazar H0
## Warning in chisq.test(tabla6): Chi-squared approximation may be incorrect
##
## Pearson's Chi-squared test
##
## data: tabla6
## X-squared = 3.5453, df = 2, p-value = 0.1699
Obtenemos un p-value=0.1699, por lo que no podemos rechazar H0. Por esta razón, concluimos que no existen diferencias significativas entre los estudiantes de establecimientos municipales y particular subvencionados en la variable COL_5. A pesar de estos resultados, calculamos igualmente el tamaño del efecto
cramersV(tabla6) #0.16, efecto pequeño
## Cramér's V = 0.16
Y graficamos la relación entre ambas variables
ggplot(Datos, aes(COL_5, group=factor(ESTABLECIMIENTO))) +
geom_bar(aes(y = ..prop..,fill = ESTABLECIMIENTO),stat="count") +
scale_y_continuous(labels=scales::percent,limits = c(0,1)) + labs(x="Me siento querido(a) por mis profesores", y="Porcentaje") +
scale_fill_grey() +
geom_text(aes( label = scales::percent(..prop..),
y= ..prop.. ), stat= "count", vjust = 1) +
facet_grid(~ESTABLECIMIENTO,labeller = label_wrap_gen(width=10)) +
theme(axis.title.y=element_blank(), axis.title.x =element_text(size=12),
axis.text.y =element_text(size=10), axis.text.x =element_text(size=10,vjust=1),strip.text.x = element_text(size = 12,face="bold"))